/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wypozyczalnia;

import commons.AbstractDAO;
import java.util.logging.Level;
import java.util.logging.Logger;
import data.Rezerwacja;
import java.sql.SQLException;
import java.util.ArrayList;
import klient.WypozyczonaKsiazkaData;

/**
 *
 * @author xxx
 */
public class OdbiorKsiazkiDAO extends AbstractDAO {

    public OdbiorKsiazkiDAO() {
        super();
    }

    public ArrayList<WypozyczonaKsiazkaData> wyszukajDelikwenta(WypozyczonaKsiazkaData data) {
        ArrayList<WypozyczonaKsiazkaData> list = new ArrayList<WypozyczonaKsiazkaData>();


        try {
            query = " SELECT "
                    + "u.ident_biblioteczny, "
                    + "u.imie imieu, "
                    + "u.nazwisko nazwiskou, "
                    + "wy.numer_wypozyczenia, "
                    + "k.ident_ksiazki, "
                    + "k.numer_isbn ,"
                    + "a.imie imiea, "
                    + "a.nazwisko nazwiskoa,"
                    + "k.tytul , "
                    + "w.nazwa_wydawnictwa , "
                    + "k.data_wydania , "
                    + "k.status   "
                    + "FROM ksiazki k , "
                    + "autorzy  a, "
                    + "wydawnictwa  w  , "
                    + "uzytkownicy u , "
                    + "wypozyczenia wy "
                    + "WHERE k.tytul LIKE ? "//1

                    + "and k.ident_autora = a.ident_autora  "
                    + "and k.ident_wydawnictwa = w.ident_wydawnictwa "
                    + "and u.ident_biblioteczny = wy.ident_biblioteczny "
                    + "and wy.ident_ksiazki = k.ident_ksiazki "
                    + "and u.nazwisko LIKE ? "//4
                    + "and u.imie LIKE ? "//5
                    + "and k.numer_isbn LIKE ?";//6


            prepStmt = conn.prepareStatement(query);
            prepStmt.setString(1, data.getTytul() + "%");
            prepStmt.setString(2, data.getNazwiskoWypozyczajacego() + "%");
            prepStmt.setString(3, data.getImieWypozyczajacego() + "%");
            prepStmt.setString(4, data.getIsbn() + "%");
            rs = prepStmt.executeQuery();
            System.out.println("znaki : " + data.getTytul() + "%" + " : " + data.getNazwiskoWypozyczajacego() + "%" + " : " + data.getImieWypozyczajacego() + "%" + " : " + data.getIsbn() + "%");
            while (rs.next()) {
                System.out.println("jest");
                //System.out.println("zaiwra");
                WypozyczonaKsiazkaData data1 = new WypozyczonaKsiazkaData();

                data1.setIdBiblioteczny(rs.getInt("ident_biblioteczny"));
                data1.setImieWypozyczajacego(rs.getString("imieu"));
                data1.setNazwiskoWypozyczajacego(rs.getString("nazwiskou"));
                data1.setIdWypozyczenia(rs.getInt("numer_wypozyczenia"));
                data1.setIdKsiazki(rs.getInt("ident_ksiazki"));
                data1.setIsbn(rs.getString("numer_isbn"));
                data1.setImieAutora(rs.getString("imiea"));
                data1.setNazwiskoAutora(rs.getString("nazwiskoa"));
                data1.setTytul(rs.getString("tytul"));
                data1.setNazwaWydawnictwa(rs.getString("nazwa_wydawnictwa"));
                data1.setDataWydania(rs.getDate("data_wydania"));
                data1.setStatus(rs.getString("status"));

                list.add(data1);

            }
            return list;

        } catch (SQLException ex) {
            Logger.getLogger(OdbiorKsiazkiDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    public boolean odbiorKsiazki(Integer idKsiazki) {
        Rezerwacja rezerwacja = null;

        try {
            if (usunWypozyczenie(idKsiazki) == true) {
                rezerwacja = sprawdzRezerwacje(idKsiazki);
                if (rezerwacja != null) // jest rezerwacja
                {
                    if (wypozyczKsiazke(rezerwacja.getIdBiblioteczny(), rezerwacja.getIdKsiazki()) == true) {
                        usunRezerwacje(idKsiazki);
                        if (!ustawKsiazkeJakoWypozyczona(idKsiazki) == true) {
                            error("Udało się uddać książkę, ale nie udało się wypożyczyć osobie oczekującej ");
                        }else
                        {
                            return true;
                        }

                    } else {
                        error("Udało się uddać książkę, ale osoba, ale nie udało się wypożyczyć osobie oczekującej");
                        return false;
                    }



                } else // brak rezerwacji
                {
                    return true;
                }


            } else {
                error("Nie można usunąć wpisu wypożyczenia.");
                return false;
            }



            prepStmt = conn.prepareStatement(query);
            prepStmt.setInt(1, getIdBiblioteczny());
            rs = prepStmt.executeQuery();

        } catch (SQLException ex) {
            error(ex.getMessage());
            Logger.getLogger(OdbiorKsiazkiDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;


    }

    public Double sprawdzCzyDoZaplaty(Integer idKsiazki) {
        Double doZaplaty;

        try {

            query = " select  if((current_date-data_zwrotu)>0 ,(current_date-data_zwrotu)*0.2 , 0 ) do_zaplaty  "
                    + "from wypozyczenia "
                    + "where ident_ksiazki=?";

            prepStmt = conn.prepareStatement(query);
            prepStmt.setInt(1, idKsiazki);
            rs = prepStmt.executeQuery();

            if (rs.next()) {
                doZaplaty = rs.getDouble("do_zaplaty");

                doZaplaty = Math.round(doZaplaty * 100) / 100.0d;

                return doZaplaty;
            } else {
                return 0.00;
            }

        } catch (SQLException ex) {
            error(ex.getMessage());
            Logger.getLogger(OdbiorKsiazkiDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return 0.00;

    }

    private Rezerwacja sprawdzRezerwacje(Integer idKsiazki) {
        try {
            Rezerwacja data = new Rezerwacja();
            query = "select * , IF(data_wygasniecia>=current_date,'aktualne','nieaktualne') status  "
                    + "from rezerwacje "
                    + "where ident_ksiazki=?";

            prepStmt = conn.prepareStatement(query);
            prepStmt.setInt(1, idKsiazki);
            rs = prepStmt.executeQuery();
            if (rs.next()) {

                data.setIdKsiazki(rs.getInt("ident_ksiazki"));
                data.setIdBiblioteczny(rs.getInt("ident_biblioteczny"));
                data.setDataRezerwacji(rs.getDate("data_rezerwacji"));
                data.setDataWygasniecia(rs.getDate("data_wygasniecia"));
                data.setNuerRezerwacji(rs.getInt("numer_rezerwacji"));
                String status = rs.getString("status");

                if (status != null && status.equals("aktualne")) { // jest aktualna rezerwacja
                    return data;
                } else { // rezerwacja nie aktulna - wywalamy ją.
                    usunRezerwacje(data.getNuerRezerwacji());



                    return null;
                }

            } else // brak jakiejkolwiek rezerwacji
            {
                return null;
            }


        } catch (SQLException ex) {
            error(ex.getMessage());
            Logger.getLogger(OdbiorKsiazkiDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;

    }

    public boolean usunWypozyczenie(Integer idKsiazki) {
        try {

            query = "delete from wypozyczenia where ident_ksiazki=?";
            prepStmt = conn.prepareStatement(query);
            prepStmt.setInt(1, idKsiazki);
            if (prepStmt.executeUpdate() > 0) {
                query = "update ksiazki set status='dostępna' where ident_ksiazki=?";
                prepStmt = conn.prepareStatement(query);
                prepStmt.setInt(1, idKsiazki);

                if (prepStmt.executeUpdate() > 0) {
                    return true;
                } else {
                    error("nie udało się usunąć wypożyczenia.");
                    return false;
                }


            } else {
                error("nie udało się usunąć wypożyczenia.");
                return false;
            }

        } catch (SQLException ex) {
            error(ex.getMessage());
            Logger.getLogger(OdbiorKsiazkiDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return false;

    }

    public void dodajWplate(Integer idBiblioteczny, Double kwota) {
        try {

            query = "INSERT INTO biblioteka.wplaty ( "
                    + "numer_transakcji , "
                    + "data_wplaty ,"
                    + "kwota ,"
                    + "ident_biblioteczny )"
                    + "VALUES ("
                    + "NULL , "
                    + "current_date, "
                    + "?, "
                    + "?)";

            prepStmt = conn.prepareStatement(query);
            prepStmt.setDouble(1, kwota);
            prepStmt.setInt(2, idBiblioteczny);

            if (prepStmt.executeUpdate() > 0) {
            } else {
                error("Nie zaksięgowano wpłaty.");
            }

        } catch (SQLException ex) {
            error(ex.getMessage());
            Logger.getLogger(OdbiorKsiazkiDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


    }

    private boolean usunRezerwacje(Integer idRezerwacji) {
        try {

            query = "delete from rezerwacje where numer_rezerwacji=?";

            prepStmt = conn.prepareStatement(query);
            prepStmt.setInt(1, idRezerwacji);
            if (prepStmt.executeUpdate() > 0) {
                return true;
            } else {
                return false;
            }

        } catch (SQLException ex) {
            error(ex.getMessage());
            Logger.getLogger(OdbiorKsiazkiDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;

    }

    private boolean wypozyczKsiazke(Integer idBiblioteczny, Integer idKsiazki) {
        try {

            query = "INSERT INTO `biblioteka`.`wypozyczenia` (`"
                    + "numer_wypozyczenia`, "
                    + "`ident_ksiazki`, `"
                    + "ident_biblioteczny`, "
                    + "`data_wypozyczenia`, "
                    + "`data_zwrotu`, prolongata) "
                    + "VALUES ("
                    + "NULL, "
                    + "?, "
                    + "?, "
                    + "current_date"
                    + ", DATE_ADD(current_date, INTERVAL ? DAY), 0)";



            prepStmt = conn.prepareStatement(query);

            prepStmt.setInt(1, idKsiazki);
            prepStmt.setInt(2, idBiblioteczny);
            prepStmt.setInt(3, 14);


            Integer ile = prepStmt.executeUpdate();
            if (ile > 0) {
                return true;

            } else {
                return false;
            }

        } catch (SQLException ex) {
            error(ex.getMessage());
            Logger.getLogger(OdbiorKsiazkiDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;

    }

    private boolean ustawKsiazkeJakoWypozyczona(Integer idKsiazki) {
        try {
            query = " UPDATE biblioteka.ksiazki "
                    + "SET status = 'wypożyczona' "
                    + "WHERE ksiazki.ident_ksiazki =? ";

            prepStmt = conn.prepareStatement(query);
            prepStmt.setInt(1, idKsiazki);              
            prepStmt.executeUpdate();
            if (prepStmt.executeUpdate() > 0) {
                return true;
            } else {
                return false;
            }

        } catch (SQLException ex) {
            error(ex.getMessage());
            Logger.getLogger(OdbiorKsiazkiDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
}
